package database

import (
	"admin-nexus-backend/config"
	"admin-nexus-backend/internal/model"
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var DB *gorm.DB

// InitMySQL 初始化 MySQL 连接
func InitMySQL() error {
	dsn := config.GetMySQLDSN()
	c := config.GlobalConfig.Database.MySQL

	// 配置 GORM
	gormConfig := &gorm.Config{
		// 禁用外键约束
		DisableForeignKeyConstraintWhenMigrating: true,
	}

	// 设置日志级别
	switch c.LogLevel {
	case 1:
		gormConfig.Logger = logger.Default.LogMode(logger.Silent)
	case 2:
		gormConfig.Logger = logger.Default.LogMode(logger.Error)
	case 3:
		gormConfig.Logger = logger.Default.LogMode(logger.Warn)
	case 4:
		gormConfig.Logger = logger.Default.LogMode(logger.Info)
	default:
		gormConfig.Logger = logger.Default.LogMode(logger.Info)
	}

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), gormConfig)
	if err != nil {
		return fmt.Errorf("连接 MySQL 失败: %w", err)
	}

	// 获取底层的 *sql.DB
	sqlDB, err := db.DB()
	if err != nil {
		return fmt.Errorf("获取数据库实例失败: %w", err)
	}

	// 设置连接池
	sqlDB.SetMaxIdleConns(c.MaxIdleConns)
	sqlDB.SetMaxOpenConns(c.MaxOpenConns)
	sqlDB.SetConnMaxLifetime(time.Duration(c.ConnMaxLifetime) * time.Second)

	// 测试连接
	if err := sqlDB.Ping(); err != nil {
		return fmt.Errorf("数据库连接测试失败: %w", err)
	}

	DB = db
	return nil
}

// CloseMySQL 关闭 MySQL 连接
func CloseMySQL() error {
	if DB != nil {
		sqlDB, err := DB.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}

// GetDB 获取数据库实例
func GetDB() *gorm.DB {
	return DB
}

// AutoMigrate 自动迁移数据库表
func AutoMigrate() error {
	// 导入模型
	return DB.AutoMigrate(
		&model.User{},
		&model.Role{},
		&model.Resource{},
		&model.Organization{},
		&model.City{},
		&model.UserRole{},
		&model.RoleResource{},
		&model.RoleDataPermission{},
		&model.OperationLog{},
		&model.LoginLog{},
		&model.PermissionLog{},    // 权限日志表
		&model.DictType{},         // 字典类型表
		&model.DictData{},         // 字典数据表
		&model.Attachment{},       // 附件表
		&model.UserOperationLog{}, // 用户操作日志表
	)
}
